package com_.dxy_test_.drawseal;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Description 画图测试
 * @Author dangxianyue
 * @Date 2024/3/30 18:15
 */
public class DrawSealTest {

    // 输出
    private static final String OUT_PATH = "C:\\Users\\Alex\\Desktop\\seal.jpg";

    public static void main(String[] args) throws IOException {
        final BufferedImage image = buildSealImage("2024-03-28");
        try (FileOutputStream out = new FileOutputStream(OUT_PATH)) {
            ImageIO.write(image, "jpg", out);
        }


    }

    /**
     * 画签章图
     * 在计算中的坐标系通过是第四象限
     * X 轴（X-axis）： 水平的直线被称为 x 轴。正方向通常是从左往右，负方向则相反
     * Y 轴（Y-axis）： 垂直的直线被称为 y 轴。正方向通常是从上往下，负方向则相反。
     *
     * @param dateString
     * @return
     */
    public static BufferedImage buildSealImage(String dateString) {

        // 参数
        final int width = 410, height = 410; // 画布大小
        final int centerX = 205, centerY = 205, radius = 200;// 圆心坐标，半径
        final int distance = 50; // 中间平行线和圆心的垂直距离
        final String fixedString = "已审批";
        final int fixedStringFontSize = 70; // 固定字体大小
        final int dateStringFontSize = 50; // 日期字体大小
        final int fixedStringIntervalWithUpLine = 35;// 固定文字和上部水平线的间隔


        // 画布
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 画笔
        Graphics2D g2d = bi.createGraphics();

        // 将背景填充为白色
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);

        // 重新设置画笔粗细和颜色
        g2d.setStroke(new BasicStroke(5));//BasicStroke(线条粗细)
        g2d.setColor(Color.RED);// 线条颜色

        // 画圆，四个参数：椭圆的左上角的 x 坐标，椭圆的左上角的 y 坐标，椭圆的宽度，椭圆的高度
        g2d.drawOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius);

        // ==============画中间两条水平线 start ===================
        // 已知直接三角形的斜边长度为半径和水平线到圆心的垂直距离，根据勾股定理计算出水平直角边的长度
        int a = (int) Math.round(Math.sqrt(Math.pow(radius, 2) - Math.pow(distance, 2)));
        int x1, x2, y1, y2;
        x1 = centerX - a;
        x2 = centerX + a;
        y1 = y2 = centerY - distance;
        g2d.drawLine(x1, y1, x2, y2);// 画上面的水平线

        y1 = y2 = centerY + distance;
        g2d.drawLine(x1, y1, x2, y2);// 画下面的水平线
        // ==============画中间两条水平线 end ===================


        // ==============画“已审核”字体 start ===================
        // 设置绘制的字体
        Font font = new Font("SimSun", Font.PLAIN, fixedStringFontSize); // 宋体，普通样式，字号大小为20
        g2d.setFont(font);

        // 计算文字的宽度和高度
        FontMetrics metrics = g2d.getFontMetrics(font);
        int textWidth = metrics.stringWidth(fixedString);

        // 计算文字的基线位置，baselineX：文字最左侧，baselineY：文字底部
        int baselineX = centerX - textWidth / 2; // 文字左侧在圆心左侧的偏移量
        int baselineY = centerY - distance - fixedStringIntervalWithUpLine;

        g2d.drawString(fixedString, baselineX, baselineY);
        // ==============画“已审核”字体 end ===================

        // ==============画审核字体 start ===================
        // 设置绘制的字体
        font = new Font("SimSun", Font.PLAIN, dateStringFontSize); // 宋体，普通样式，字号大小为20
        g2d.setFont(font);

        // 计算文字的宽度和高度
        metrics = g2d.getFontMetrics(font);
        textWidth = metrics.stringWidth(dateString);
        int textHeight = metrics.getHeight();

        // 计算文字的基线位置
        baselineX = centerX - textWidth / 2; // 文字左侧在圆心左侧的偏移量
        baselineY = centerY + textHeight / 4; // 文字基线在圆的垂直直径的一半处

        g2d.drawString(dateString, baselineX, baselineY);
        // ==============画“已审核”字体 end ===================

        // 释放资源
        g2d.dispose();

        return bi;
    }
}
